home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The PC-SIG Library 10
/
The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso
/
PC_SIGCD
/
09
/
3
/
DISK0932.ZIP
/
SOURCE.EXE
/
arc
/
LABCOAT.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1991-03-31
|
61KB
|
1,947 lines
{ A Laboratory Management & Analysis Program }
{ by }
{ Douglas Standing & Gen. Max VonBirdface }
{ VERSION 4.0 }
{ Copyright 1991 }
{ This version includes code to call QCHART.EXE out of the }
{ Statisitics routine in Labcoat. The file Exec.com from }
{ Bela Lubkin, via TUG, is essential & much appreciated. }
{ If you wish to use or modify the code for Exec, contact }
{ me. Unfortunately Birdface kicked the bucket 2/89, }
{ and he will not be able to help you. He was a good bird. }
PROGRAM LABCOAT;
VAR
QUIT : BOOLEAN;
CH : CHAR;
I,J: INTEGER;
PROCEDURE CLEARLINES; { Clears lines 23 & 24 for repeated entry }
BEGIN
GOTOXY(1,23);
TEXTBACKGROUND(1);
CLREOL;
GOTOXY(1,24);
TEXTBACKGROUND(1);
CLREOL;
END;
PROCEDURE MAKEaLINE; { Screen drawer of lines }
BEGIN
FOR I := 1 TO 80 DO
WRITE(CHR(205));
WRITELN;
END;
PROCEDURE MAKEaBORDER (VAR OUTFILE : TEXT); { Makes lines on reports }
BEGIN
FOR I := 1 TO 80 DO
WRITE(LST,CHR(61)); { best with EPSON char set }
WRITELN(LST); { IBM would be 205 }
END;
PROCEDURE SIGNON; { Initial Screen gizmo }
BEGIN
GRAPHBACKGROUND(1);
TEXTBACKGROUND(1);
CLRSCR;
GOTOXY(15,8);
LOWVIDEO;
FOR I := 1 TO 50 DO
BEGIN
WRITE(CHR(205))
END;
GOTOXY(20,10);
HIGHVIDEO;
TEXTBACKGROUND(1);
TEXTCOLOR(4);
WRITELN(' LABORATORY DATA & COST ANALYSIS');
WRITELN(' by ');
WRITELN(' D. Standing and M. VonBirdface');
WRITELN(' v4.0 copyright 1991');
GOTOXY(15,14);
LOWVIDEO;
FOR J := 1 TO 50 DO
BEGIN
WRITE(CHR(205));
END;
DELAY(4500);
CLRSCR
END;
PROCEDURE EXPLAIN; { 2nd screen - blame it on Birdface }
{ or remove the call from main code }
BEGIN { if it annoys you , or to speed up }
TEXTBACKGROUND(1); CLRSCR;GOTOXY(15,7);
WRITELN('The Name, Labcoat, & All Compiled Files Copyright 1991');
GOTOXY(15,10);
TEXTCOLOR(15);
WRITELN(' You will be asked for numerous inputs in this program.');
GOTOXY(15,12);
TEXTCOLOR(0);
WRITELN(' If you are interested in seeing a list of the variables,');
GOTOXY(15,13);
WRITELN('the opportunity to print them will come on the next screen.');
GOTOXY(15,15);
TEXTCOLOR(3);
WRITELN(' If you are pleased with the program or have comments,');
GOTOXY(15,16);
TEXTCOLOR(15);
WRITELN(' send comments AND CASHEWS to my co-author:');
GOTOXY(15,18);
TEXTCOLOR(4);
WRITELN(' General Max VonBirdface ');
GOTOXY(15,19);
WRITELN(' 943 Aster Ct, Sunnyvale CA 94086');
GOTOXY(12,21);
TEXTCOLOR(3);
WRITELN(' (Birdface is the parrot who wrote most of the error traps)');
WRITELN;
TEXTCOLOR(0);
WRITE(' Peck Any Key To Continue');
READ(KBD,CH);
END;
{###################### Main Test Cost Routine ##############################}
OVERLAY PROCEDURE GETIT; { Note: The sole Overlay Procedure in this Program. }
{ LIPID has many - Reason: Heap-Stack crashes }
{ between Labcoat and Lipid at Lipid Call }
TYPE
STRINGTYPE = STRING[50];
VAR MAKER {manufacture name},
TESTNAME {kit name},
THISDATE {current date},
PLACENAME {clinic or lab name},
STABLELIFE {reagent reconstituted stability} :STRINGTYPE;
KITCOST {price/kit},
CONSUMPRICE {cost/test consumables},
CONSUMABLES {price/pkg of consumables},
COLLECTI {drawing/processing costs},
REFLAB {the competition price},
DEPRECYR {annual inst depreciation amount},
QC {cost/yr of survey spec for this test},
QCSPEC {qc/12},
YOURPRICE {tentative charge},
COSTTEST1 {kitcost/kittests},
PTREP {1 patient x replicate},
CONSUM {consumprice},
STANDARDSET {cost of separate stds},
STANDARDCOST {cost / run for sep stds },
CALIBCST {cost/pkg of calibrators},
CALIBCSTRN {cost per test run of calibration },
DRAW {collection},
SURVEY {qc/12/testpermonth},
DEPREC1 {depreciation costs/run},
INITIAL { the calculated cost / run setup },
PTS { testcost for pts after initial },
PRIMECOST { cost per run of inst primes },
TESTCOST { initial + pts / # patients per run },
TECHTIME { tech time in min. to do batch},
TECHDOLLARS { tech salary in $/Hr },
MAINTENENCE {service contract or yearly maint charges},
UPKEEP {cost/run for MAINTENENCE},
RUNKITMONTH { runs / kit / month },
RUNCONSUMMONTH {runs / pkg disposables / month },
LABOR { techtime x (techdollars/60 },
VT,CT,XT,FC,RT,DT,DE,CALR,CALC, {see cost breakdown section}
BREAKEVEN,COSTBRKEVEN,PROFLOSS,REVBRKEVEN, {deal w/ break-even}
TOTALCOST,TOTALSALES,UNITCOST,VARIABLECOST { " } : REAL;
KITTESTS {number of tests/kit} ,
NUMCONTROLS {number of different control levels},
NUMSTANDARDS {number of standards/run},
BLANK {number of blanks/run} ,
REPLICATE {number of replicates of controls & pts/run},
NUMCONSUMTST {number of tests/pkg consumables},
TOTALANATST {max number/run for analyser},
STDSRUN {number of runs to use up purchased standards},
CALIBLIFE {# runs useful calibrator life},
CALFREQ {times/month calibrators used},
NUMCAL {number of calib tests each calibration},
TESTPERMONTH {expected number of this test/month},
SHELFLIFE {shelf life of kit reagents},
STANDARDLIFE {# of runs/std set},
MAXHEADROOM {est avg # pt spec/batch},
MAXBATCH {maximum batch # for analyser},
RUNSPERMONTH { expected # of runs per month },
PRIME { # tests reag used to prime inst. },
CURQUAN,ENDQTY,INCRQTY,STARTQTY, {for break-even}
SICKO { number of pts to be run } : INTEGER;
{************************** Input Section **********************************}
BEGIN
GRAPHBACKGROUND(1);
TEXTBACKGROUND(1);
CLRSCR;
GOTOXY(1,5);
TEXTCOLOR(0);
MAKEaLINE;
GOTOXY(1,6);
TEXTCOLOR(4);
MAKEaLINE;
GOTOXY(1,7);
TEXTCOLOR(14);
MAKEaLINE;
GOTOXY(1,8);
TEXTCOLOR(2);
MAKEaLINE;
GOTOXY(1,9);
TEXTCOLOR(0);
MAKEaLINE;
GOTOXY(10,12);
TEXTCOLOR(0);
WRITELN('Please type in answers as requested, then press Enter Key.');
TEXTCOLOR(15);
WRITELN;
WRITE(' DO NOT USE COMMAS OR DOLLAR SIGNS');
GOTOXY(1,23);
TEXTCOLOR(7);
WRITE('Enter the name of your Facility (( 50 Characters Max )).');
GOTOXY(1,24);
READ(PLACENAME);
CLEARLINES;
GOTOXY(1,23);
WRITE('Enter today''s date: ');
READ(THISDATE);
CLEARLINES;
GOTOXY(1,23);
WRITE('Enter the name of the test: ');
READLN(TESTNAME);
CLEARLINES;
GOTOXY(1,23);
WRITE('Name of the ',TESTNAME,' kit Manufacturer: ');
READLN(MAKER);
CLEARLINES;
KITCOST:= 0;KITTESTS:= 1;SHELFLIFE:=0;
GOTOXY(1,23);
WRITE('Enter the price / kit for ',MAKER,'''s kit: $ ');
READ(KITCOST);
CLEARLINES;
GOTOXY(1,23);
WRITE('Enter the number of tests in each ',MAKER,' kit: ');
READ(KITTESTS);
CLEARLINES;
GOTOXY(1,23);
WRITE
('Enter ',MAKER,'''s claimed avg. shelf life (months) for the reagents: ');
READ(SHELFLIFE);
CLEARLINES;
GOTOXY(1,23);
WRITE
('Enter reconsituted stability of reagents (type hours or days): ');
READ(STABLELIFE);
CLEARLINES;
GOTOXY(1,23);
QC:= 0;NUMSTANDARDS:=0;STANDARDSET:= 0;STANDARDLIFE:= 1;
WRITE
('If extra QC survey specimens are necessary, enter cost/yr (or `0''): $ ');
READ(QC);
CLEARLINES;
GOTOXY(1,23);
WRITE('Enter the number of standards each run: ');
READ(NUMSTANDARDS);
IF (NUMSTANDARDS > 0) THEN
BEGIN
CLEARLINES;
GOTOXY(1,23);
WRITE('Are the standards run in duplicate? (Y/N): ');
READ(KBD,CH);
IF (CH = 'Y') OR (CH = 'y') THEN NUMSTANDARDS := NUMSTANDARDS * 2;
CLEARLINES;
GOTOXY(1,23);
WRITE('Are Standards purchased separately from the kit? (Y/N) : ');
READ(KBD,CH);
IF (CH='Y') OR (CH='y') THEN
BEGIN
CLEARLINES; STANDARDSET:=0; STANDARDCOST:=0;
GOTOXY(1,23);
WRITE('Enter the cost of The Standards set:$ ');
READ(STANDARDSET);
CLEARLINES;
GOTOXY(1,23);
WRITE
('Enter the estimated # of runs obtained / standard set: ');
READ(STANDARDLIFE);
CLEARLINES;
END;
CLEARLINES;
END;
REPEAT
GOTOXY(1,23);
WRITE
('Is calibration (as opposed to routine standards) required? (Y/N): ');
READ(KBD,CH);
CLEARLINES;
CALIBCST:=0;CALIBLIFE:=1;CALFREQ:=1;NUMCAL:=0;
UNTIL (CH = 'Y') OR (CH = 'y') OR (CH = 'N') OR (CH = 'n');
IF (CH='Y') OR (CH='y') THEN
BEGIN
CLEARLINES;
GOTOXY(1,23);
WRITE('What is the cost of calibrators? :$ ');
READ(CALIBCST);
CLEARLINES;
GOTOXY(1,23);
WRITE('How many months can calibrators be used? : ');
READ(CALIBLIFE);
CLEARLINES;
GOTOXY(1,23);
WRITE('How many times / year is calibration required? : ');
READ(CALFREQ);
CLEARLINES;
GOTOXY(1,23);
WRITE('How many calibrator tests are run each calibration? : ');
READ(NUMCAL);
CLEARLINES;
END;
CLEARLINES;
NUMCONTROLS:= 0;BLANK:= 1;REPLICATE:= 0;CONSUMABLES:= 0;
GOTOXY(1,23);
WRITE('Enter the number of different control levels / run: ');
READ(NUMCONTROLS);
CLEARLINES;
GOTOXY(1,23);
WRITE('Enter the number of blanks / run: ');
READ(BLANK);
CLEARLINES;
REPEAT
GOTOXY(1,23);
WRITE
('Enter `2'' if you are running things in duplicate, or `1'' if not: ');
READ(REPLICATE);
CLEARLINES;
UNTIL (REPLICATE = 1) OR (REPLICATE = 2);
REPEAT
CLEARLINES;
CONSUMABLES:=0;NUMCONSUMTST:=1;CONSUMPRICE:=0;REFLAB:=0;MAINTENENCE:=0;
GOTOXY(1,23);
WRITELN
('Does this test use consumables in the testing process? (Y/N): ');
READ(KBD,CH);
UNTIL (CH='Y') OR (CH='y') OR (CH='N') OR (CH='n');
IF (CH='Y') OR (CH='y') THEN
BEGIN
CLEARLINES;
GOTOXY(1,23);
WRITE
('Enter price for a known quantity of consumables for ',MAKER,'''s test.');
WRITE('Pick the price for a package or case, etc: $ ');
READ(CONSUMABLES);
CLEARLINES;
GOTOXY(1,23);
WRITE('How many tests / package of those consumables? ');
READ(NUMCONSUMTST);
END;
CLEARLINES;
GOTOXY(1,23);
WRITE
('What is the estimated drawing cost (labor / supplies) / test: $ ');
READ(DRAW);
CLEARLINES;
GOTOXY(1,23);
WRITE('Enter the price your reference lab charges for ',TESTNAME,': $ ');
READ(REFLAB);
CLEARLINES;
GOTOXY(1,23);
TOTALANATST:=1;DEPRECYR:=0;PRIME:=1;PRIMECOST:=0;MAINTENENCE:=0;
TECHTIME:=0;TECHDOLLARS:=0;YOURPRICE:=0.001;STARTQTY:=0;
WRITE('Do you want to include instrumentation costs? (Y/N): ');
REPEAT
READ(KBD,CH);
UNTIL (CH='Y') OR (CH='y') OR (CH='N') OR (CH='n');
IF (CH=('Y')) OR (CH='y') THEN
BEGIN
GOTOXY(1,23);
WRITE('Please enter yearly maintenence costs for your instrument: $ ');
READ(MAINTENENCE);
CLEARLINES;
REPEAT
GOTOXY(1,23);
WRITE('Will an automated or semi-automated analyser be used? (Y/N): ');
READ(KBD,CH);
IF (CH = ('Y')) OR (CH = 'y') THEN
BEGIN
CLEARLINES;
GOTOXY(1,23);
WRITE
('How many different tests, including ',TESTNAME,' is it doing: ');
READ(TOTALANATST);
CLEARLINES;
GOTOXY(1,23);
WRITELN
('If you wish to enter this year''s depreciation allowance ');
WRITE('on the instrument, do so now, or enter `0'': $ ');
READ(DEPRECYR);
CLEARLINES;
GOTOXY(1,23);
WRITE
('How much reagent (in # of tests) are used to prime the analyser each run: ');
READ(PRIME);
CLEARLINES;
END
ELSE
CLEARLINES;
UNTIL
(CH = 'Y') OR (CH ='y') OR (CH = 'N') OR (CH = 'n');
END;
CLEARLINES;
GOTOXY(1,23);
WRITE('What is estimated Tech. time in minutes per batch run? : ');
READ(TECHTIME);
CLEARLINES;
GOTOXY(1,23);
WRITE('What is Tech salary / Hr? : $ ');
READ(TECHDOLLARS);
CLEARLINES;
GOTOXY(1,23);
WRITE
('To prepare Break-Even report, enter price you will charge for the test: $ ');
READ(YOURPRICE);
CLEARLINES;
GOTOXY(1,23);
WRITE
('Please enter the Minimum number of Patients necessary to run a batch: ');
READ(STARTQTY);
CLEARLINES;
ENDQTY:= 0;INCRQTY:= 0;MAXBATCH:= 0;MAXHEADROOM:= 0;RUNSPERMONTH:= 1;
GOTOXY(1,23);
WRITE
('Enter The Maximum number of Patients in a batch of ',TESTNAME,': ');
READ(ENDQTY);
CLEARLINES;
GOTOXY(1,23);
WRITE
('For Break-Even report, what increments of patient quantities to show? : ');
READ(INCRQTY);
CLEARLINES;
GOTOXY(1,23);
REPEAT
WRITE
('What is the maximum batch size (blank,stds,ctrls,pts) you can run?: ');
READ(MAXBATCH);
CLEARLINES;
GOTOXY(1,23);
WRITE
('For Batch run efficiency report, enter avg. # of patient spec / batch: ');
READ(MAXHEADROOM);
IF MAXHEADROOM > MAXBATCH THEN
BEGIN
CLEARLINES;
GOTOXY(1,23);
TEXTCOLOR(4);
WRITELN
('YOUR AVERAGE BATCH AMOUNT EXCEEDS YOUR MAXIMUM BATCH SIZE');
TEXTCOLOR(0);
WRITE('Press any key to continue');
READ(KBD,CH);
CLEARLINES;
END;
UNTIL (MAXHEADROOM) <= (MAXBATCH);
CLEARLINES;
GOTOXY(1,23);
WRITE
('And, please enter the expected number of runs of ',TESTNAME,' per month: ');
READ(RUNSPERMONTH);
CLEARLINES;
GOTOXY(1,23);
WRITE('For a quick screen display, how many patients to run? : ');
SICKO:=1;
READ(SICKO);
CLEARLINES;
{ ccccccccccccccccccccccccccccccc COMPUTATION AND FORMULAS ccccccccccccccccc }
STANDARDCOST:= STANDARDSET / STANDARDLIFE;
CONSUMPRICE:= CONSUMABLES / NUMCONSUMTST;
PRIMECOST:= COSTTEST1 * PRIME;
LABOR:= TECHTIME * (TECHDOLLARS / 60);
DEPREC1:= DEPRECYR / (TOTALANATST * (RUNSPERMONTH * 12));
UPKEEP := MAINTENENCE / (TOTALANATST * (12 * RUNSPERMONTH));
COSTTEST1 := KITCOST / KITTESTS;
SURVEY := QC / (TOTALANATST * (RUNSPERMONTH * 12));
CALIBCSTRN := ((CALIBCST/CALIBLIFE)/RUNSPERMONTH);
INITIAL := (COSTTEST1 * ((NUMCONTROLS * REPLICATE) + BLANK + NUMSTANDARDS)) +
DEPREC1 + (CONSUMPRICE *
(( NUMCONTROLS * REPLICATE) + BLANK + NUMSTANDARDS))
+ SURVEY + LABOR + UPKEEP + STANDARDCOST + CALIBCSTRN + PRIMECOST;
PTS := (COSTTEST1 * (SICKO * REPLICATE)) + (DRAW * SICKO)
+ (CONSUMPRICE * SICKO);
TESTCOST := (INITIAL + PTS)/ SICKO;
RUNKITMONTH := RUNSPERMONTH / (KITTESTS /((REPLICATE *
(NUMCONTROLS + MAXHEADROOM)) +
(BLANK + NUMSTANDARDS) + (NUMCAL / (CALFREQ * 12)) +
PRIME ));
RUNCONSUMMONTH := NUMCONSUMTST /((REPLICATE*(NUMCONTROLS + MAXHEADROOM)) +
(BLANK + NUMSTANDARDS));
TESTPERMONTH := MAXHEADROOM * RUNSPERMONTH;
VARIABLECOST:= ((COSTTEST1 * REPLICATE) + (CONSUMPRICE * REPLICATE) +
DRAW);
TOTALCOST:=INITIAL + (VARIABLECOST * CURQUAN);
TOTALSALES:= YOURPRICE * CURQUAN;
BREAKEVEN:= INITIAL / (YOURPRICE - VARIABLECOST);
REVBRKEVEN:= YOURPRICE * BREAKEVEN;
COSTBRKEVEN:= INITIAL + (VARIABLECOST * BREAKEVEN);
{****************************************************************************}
GOTOXY(10,17); { Give Quick Screen Answer }
TEXTCOLOR(14);
WRITE
('Your run cost for ',SICKO,' pts for ',MAKER,'''s ',
TESTNAME,' is: $ ',TESTCOST * SICKO:2:2);
GOTOXY(10,19);
DELAY(4000);
WRITE
(' Thus, your cost per patient at this volume is: $',TESTCOST:2:2);
GOTOXY(4,21);
WRITE('So, with ',SICKO,' patient(s) on the run, profit is = $ ',
YOURPRICE - TESTCOST:2:2,' per patient.');
GOTOXY(15,24);
TEXTCOLOR(2);
WRITE(' Peck any key to continue... ');
READ(KBD,CH);
GRAPHBACKGROUND(3);
TEXTBACKGROUND(3);
CLRSCR;
GOTOXY(1,5);
TEXTCOLOR(0);
MAKEaLINE;
GOTOXY(1,6);
TEXTCOLOR(4);
MAKEaLINE;
GOTOXY(1,7);
TEXTCOLOR(15);
MAKEaLINE;
GOTOXY(10,10);
TEXTCOLOR(14);
WRITE(' PLEASE TURN ON YOUR PRINTER - AUTOMATIC PRINTOUT');
GOTOXY(10,15);
TEXTCOLOR(0);
WRITE(' Peck the `P'' key to begin printout or `N'' to QUIT: ');
READ(KBD,CH);
IF (CH = 'P') OR (CH = 'p') THEN
{********************* Print Routine for GETIT ******************************}
BEGIN
{ ***** PAGE 1 ***** }
WRITE(LST,(CHR(27)),(CHR(69))); { turn on emphasized pitch }
MAKEaBORDER(LST);
MAKEaBORDER(LST);
WRITE(LST,' ');
WRITELN(LST,' TEST COST DATA ANALYSIS');
MAKEaBORDER(LST);
MAKEaBORDER(LST);
WRITELN(LST);
WRITELN(LST);
WRITELN(LST,'DONE AT: ',PLACENAME);
WRITELN(LST,'DATE: ',THISDATE);
WRITELN(LST);
WRITELN(LST,'TEST: ',TESTNAME);
WRITELN(LST,'MANUFACTURER: ',MAKER);
WRITELN(LST);
MAKEaBORDER(LST);
WRITELN(LST);
WRITELN(LST,'PACKAGE COST: $ ',KITCOST:3:2);
WRITELN(LST,'YIELD: ',KITTESTS,' Tests/Kit');
WRITELN(LST,'KIT TEST COST: $ ',KITCOST/KITTESTS:2:2,'/ Test');
WRITELN(LST,'CLAIMED SHELF LIFE: ',SHELFLIFE,' months');
WRITELN(LST,'RECONSTITUTED STABILITY: ',STABLELIFE);
WRITELN(LST,'USES: ',BLANK,' Blanks per run');
WRITELN(LST,'USES: ',NUMSTANDARDS,' Standards each run');
WRITELN(LST,'CALIBRATORS COST: $ ',CALIBCSTRN:2:2,' /run');
WRITELN(LST,'USES: ',NUMCONTROLS,' levels of Controls each run');
WRITELN
(LST,'REPLICATES: ',REPLICATE,
' (1 = single 2 = controls/pts in duplicate)');
WRITELN(LST);
WRITELN(LST);
WRITELN(LST,'CONSUMABLES: $ ',CONSUMPRICE:2:2,' per test');
WRITELN(LST,'STANDARDS: $ ',STANDARDCOST:2:2,' per run');
WRITELN(LST,'DRAWING COSTS: $ ',DRAW:2:2,' per patient test');
WRITELN(LST,'TECH LABOR: $ ',LABOR:2:2,' per batch');
WRITELN(LST);
WRITELN(LST);
WRITELN
(LST,'INSTRUMENT DEPRECIATION: $ ',DEPREC1:2:2,' /this test/run day');
WRITELN(LST,'QC SURVEY COSTS: $ ',SURVEY:2:2,' /this test/run day');
WRITELN(LST,'MAINTENENCE COSTS: $ ',UPKEEP:2:2,'/this test/run day');
WRITELN(LST,'INITAL SETUP (no pts): $ ',INITIAL:2:2);
WRITELN(LST);
WRITELN(LST);
WRITE(LST,'TESTS / MONTH EXPECTED: ',RUNSPERMONTH * MAXHEADROOM);
WRITE(LST,' ');
WRITELN(LST,'* EXPECTED KIT USE: ',RUNKITMONTH:2:1,' kits/month');
WRITE(LST,' ');
WRITELN
(LST,'* EXPECTED DISPOSABLES LIFE: ',RUNCONSUMMONTH:2:1,' runs/pkg');
WRITE(LST,' ');
WRITELN
(LST,'* ASSUMING ',MAXHEADROOM,' tests/batch and ',RUNSPERMONTH,' runs/month');
WRITELN(LST);
MAKEaBORDER(LST);
WRITELN(LST);
WRITELN(LST);
WRITELN
(LST,'CURRENT REFERENCE LAB PRICE: $ ',REFLAB:2:2,' per test for ',TESTNAME);
WRITELN(LST);
WRITELN
(LST,'PROPOSED CHARGE: $ ',YOURPRICE:2:2,' per test for ',TESTNAME);
WRITELN(LST);
WRITELN(LST);
MAKEaBORDER(LST);
MAKEaBORDER(LST);
WRITELN(LST);
WRITELN(LST);
WRITE(LST,' ');
WRITELN
(LST,'SEE NEXT PAGES FOR BATCH RUN EFFICIENCY AND BREAK-EVEN ANALYSIS');
WRITE(LST,CHR(12));
{ ********************************** PAGE 2 ******************************** }
MAKEaBORDER(LST);
MAKEaBORDER(LST);
WRITE(LST,' ');
WRITELN(LST,'BATCH RUN EFFICIENCY ANALYSIS');
MAKEaBORDER(LST);
MAKEaBORDER(LST);
WRITELN(LST);
WRITELN(LST);
FOR SICKO := 1 TO MAXHEADROOM DO
BEGIN
WRITELN
(LST,'Cost of test/pt with ',SICKO,' patients = $ ',
(INITIAL + (COSTTEST1 * (SICKO * REPLICATE)) +
(DRAW * SICKO) + (CONSUMPRICE * SICKO))/SICKO:2:2);
WRITELN(LST);
END;
WRITELN(LST);
MAKEaBORDER(LST);
WRITELN(LST);
WRITELN
(LST,'Doing this test in-house with ',MAXHEADROOM,' pts saves you: $ ',
(REFLAB * MAXHEADROOM) - (INITIAL + (COSTTEST1 *
(MAXHEADROOM * REPLICATE)) + (DRAW * MAXHEADROOM) +
(CONSUMPRICE * MAXHEADROOM)):2:2);
WRITELN
(LST,'out of the reference lab liability of $ ',REFLAB * MAXHEADROOM:3:2);
WRITELN(LST,'for the same ',TESTNAME,'''s on ',MAXHEADROOM,' patients.');
WRITELN(LST);
WRITE(LST,CHR(12));
{ **************************** PAGE 3 ********************************** }
WRITELN(LST);
MAKEaBORDER(LST);
WRITELN(LST,' COST BREAKDOWN');
WRITELN(LST);
WRITELN
(LST,' FOR ',MAXHEADROOM,' PT RUN COSTING $ ',
((TESTCOST*MAXHEADROOM)/2):3:2);
{cccccccccccccccccccccccccccccccc Cost Breakdown Calculations cccccccccccccc}
IF (INITIAL < 0.0001) THEN INITIAL:=0.0001;
CT:= CONSUMPRICE + COSTTEST1;
XT:= NUMSTANDARDS + BLANK + PRIME +
((NUMCONTROLS + MAXHEADROOM)*REPLICATE);
VT:= 100*(CT*XT/(INITIAL + (COSTTEST1 *
(MAXHEADROOM *REPLICATE)) + (DRAW*MAXHEADROOM) + (CONSUMPRICE *
MAXHEADROOM))); WRITELN(LST); WRITE(LST, 'VARIABLE COSTS TOTAL: ',VT:3:1,' %');
WRITE(LST,' ');
WRITELN(LST,'COST = $ ',((VT/100)*(TESTCOST * MAXHEADROOM)/2):3:2); WRITELN(LST);
DT:=(CONSUMPRICE * MAXHEADROOM)/((TESTCOST * MAXHEADROOM)/2) * 100;
RT:=VT-DT;
WRITELN(LST,' STDS/REAGENTS: ',RT:3:1,' %');
WRITELN(LST,' DISPOSABLES: ',DT:3:1,' %');
WRITELN(LST);
WRITELN(LST);
WRITELN(LST);
WRITELN(LST);
FC:= 100 - VT;
WRITE(LST,' FIXED COSTS TOTAL: ',FC:3:1,' %');
WRITE(LST,' ');
WRITELN
(LST,' COST = $ ',(((TESTCOST * MAXHEADROOM)-
((VT/100) * (TESTCOST * MAXHEADROOM)))/2):3:2);
WRITELN(LST);
WRITELN(LST);
WRITELN(LST);
WRITELN(LST,' (FIXED COSTS INCLUDE LABOR, DEPRECIATION & MAINTENENCE)');
WRITELN(LST);
WRITELN(LST);
MAKEaBORDER(LST);
WRITELN(LST);
WRITE(LST,CHR(12));
{******************************* PAGE 4 - BREAKEVEN **************************}
WRITELN(LST);
MAKEaBORDER(LST);
WRITELN(LST);
WRITE(LST,' ');
WRITELN(LST,'BREAKEVEN TABLE FOR ',TESTNAME);
WRITELN(LST);
MAKEaBORDER(LST);
IF (STARTQTY < 1) THEN STARTQTY:=1;
CURQUAN:= STARTQTY;
WRITELN(LST);
WRITE(LST,' QTY TOTAL COST TOTAL BILLED');
WRITELN(LST,' GAIN/LOSS UNIT COST');
MAKEaBORDER(LST);
WRITELN(LST);
IF (ENDQTY < 2) THEN ENDQTY:=2;
IF (INCRQTY < 1) THEN INCRQTY:=1;
WHILE (CURQUAN <= ENDQTY) DO
BEGIN
TOTALSALES := YOURPRICE * CURQUAN;
TOTALCOST := INITIAL + (VARIABLECOST * CURQUAN);
UNITCOST := TOTALCOST / CURQUAN;
PROFLOSS := TOTALSALES - TOTALCOST;
WRITELN(LST,' ',CURQUAN:7,' ',TOTALCOST:12:2,' ',
TOTALSALES:12:2,' ',PROFLOSS:12:2,' ',
UNITCOST:12:2);
CURQUAN := CURQUAN + INCRQTY;
END;
WRITELN(LST);
MAKEaBORDER(LST);
CURQUAN := TRUNC(BREAKEVEN);
WRITELN(LST,' ',CURQUAN:7,' ',COSTBRKEVEN:12:2,' ',
REVBRKEVEN:12:2,' = BREAKEVEN POINT');
MAKEaBORDER(LST);
WRITELN(LST);
WRITELN(LST,' TOTAL FIXED COST (no Pts):$',INITIAL:12:2);
WRITELN(LST,' VARIABLE COSTS / TEST $',VARIABLECOST:12:2);
WRITELN(LST,' BILLING PRICE / TEST $',YOURPRICE:12:2);
WRITELN(LST);
MAKEaBORDER(LST);
WRITELN(LST);
WRITELN(LST);
WRITELN(LST);
IF (YOURPRICE > REVBRKEVEN) THEN
BEGIN
WRITE(LST,' ');
WRITELN
(LST,'**** At Your Price, You Profit With Even The Smallest Increment ****');
WRITELN(LST);
END;
WRITELN(LST);
WRITELN(LST);
WRITELN
(LST,' END OF REPORT FOR ',MAKER,'''S ',TESTNAME,' ANALYSIS');
WRITELN(LST);
WRITELN(LST);
WRITELN
(LST,' | Please Note: Use of Real Numbers in calculations usually yields slight |');
WRITELN
(LST,' | ( less than 1% ) inaccuracies or inconsistencies in calculations. |');
WRITE(LST,CHR(12));
END
END;
{************************* Escape Routine for GETIT ************************ }
PROCEDURE CHOOSE;
BEGIN
TEXTBACKGROUND(4); { 1st is to get out of GETIT }
TEXTCOLOR(14);
CLRSCR;
GOTOXY(20,9);
WRITE('THE FOLLOWING PROCEDURE IS VERY LONG.');
GOTOXY(17,11);
TEXTCOLOR(1);
WRITE('You will need information from PRINT VARIABLES');
GOTOXY(17,13);
TEXTCOLOR(15);
WRITE('Peck the `Y'' key to Continue or `N'' to Escape: ');
READ(KBD,CH);
IF CH = 'Y' THEN GETIT;
IF CH = 'y' THEN GETIT;
END;
{******************* Instrument Depreciation Main Routine *******************}
PROCEDURE DEPREC;
TYPE
DEPRECTYPE = (SL,SOYD,DB);
STRINGTYPE = STRING[80];
VAR {the core variables are self-explanatory}
I, L : INTEGER;
CH : CHAR;
ALLDONE : BOOLEAN;
BOOKVALUE, CUMDEPREC, CURRENTYR,
DBFACTOR, SCRAPVALUE, STRAIGHTLINE,
USEFULLIFE, YRSLEFT,AQUISCOST : REAL;
ITEMDESCR, ITEMNAME : STRINGTYPE;
LISTOUT : TEXT;
{ ####################### INTERNAL PROCEDURES TO DEPREC ##################}
PROCEDURE SIGNON; { initial fancy screen }
BEGIN
TEXTBACKGROUND(1);
GRAPHBACKGROUND(1);
CLRSCR;
GOTOXY(1,10);
TEXTCOLOR(4);
MAKEaLINE;
GOTOXY(1,11);
TEXTCOLOR(7);
MAKEaLINE;
GOTOXY(1,15);
TEXTCOLOR(7);
MAKEaLINE;
GOTOXY(1,16);
TEXTCOLOR(4);
MAKEaLINE;
GOTOXY(22,13);
TEXTCOLOR(15);
WRITE('THREE-METHOD DEPRECIATION CALCULATOR');
GOTOXY(10,20);
HIGHVIDEO;
TEXTBACKGROUND(1);
WRITE(' *** Printout is automatic. Please turn on printer ***');
DELAY(6000);
CLRSCR;
END;
PROCEDURE GETDATA; { Gets Data!! }
BEGIN
TEXTBACKGROUND(0);
GRAPHBACKGROUND(0);
CLRSCR;
GOTOXY(1,5);
TEXTCOLOR(4);
MAKEaLINE;
GOTOXY(1,6);
TEXTCOLOR(15);
MAKEaLINE;
GOTOXY(1,7);
TEXTCOLOR(1);
MAKEaLINE;
GOTOXY(5,9);
TEXTCOLOR(7);
WRITE('Enter name of the item to be depreciated: ');
READLN(ITEMNAME);
WRITELN;
GOTOXY(5,11);
WRITE('Short description of ',ITEMNAME,': ');
READLN(ITEMDESCR);
WRITELN;
GOTOXY(5,13);
WRITE('Give aquisition cost of ',ITEMNAME,' (NO COMMAS):$ ');
READLN(AQUISCOST);
WRITELN;
GOTOXY(5,15);
WRITE('Enter the useful life in years: ');
READLN(USEFULLIFE);
WRITELN;
GOTOXY(5,17);
WRITE
('Enter the scrap value at end of ',USEFULLIFE:2:0,' years (NO COMMAS):$ ');
READLN(SCRAPVALUE);
WRITELN;
GOTOXY(5,19);
WRITE('Factor (%) for Declining Balance calculations is: ');
READLN(DBFACTOR);
CLRSCR;
END;
PROCEDURE METHODHEADERS(VAR LISTOUT:TEXT ; WHATKIND:DEPRECTYPE);
{ sets up report headers }
BEGIN
WRITELN(LISTOUT);
CASE (WHATKIND) OF
SL : WRITELN(LISTOUT,'==========>> STRAIGHT-LINE METHOD');
SOYD : WRITELN(LISTOUT,'==========>> SUM-OF-YEARS-DIGITS');
DB : WRITELN
(LISTOUT,'==========>> DECLINING BALANCE with ',DBFACTOR:5:2
,' PERCENT FACTOR');
END;
WRITELN(LISTOUT);
WRITELN
(LISTOUT,' Current Year Cumulative Book');
WRITELN(LISTOUT,
'Year Depreciation Depreciation Value');
WRITELN(LISTOUT,
'------------------------------------------------------')
END;
PROCEDURE PRINTmainHEADINGS; { Prints main headings of Report!! }
BEGIN
WRITE(LST,(CHR(27)),(CHR(69)));
MAKEaBORDER(LST);
WRITELN(LISTOUT);
WRITE(LISTOUT,' ');
WRITELN(LISTOUT,' DEPRECIATION SCHEDULES');
MAKEaBORDER(LST);
WRITELN(LISTOUT);
WRITELN(LISTOUT);
WRITELN(LISTOUT,'Name of the item to be depreciated: ',ITEMNAME);
WRITELN(LISTOUT,ITEMNAME,' described as: ',ITEMDESCR);
WRITELN(LISTOUT,'Aquisition cost: $',AQUISCOST:6:2);
WRITELN(LISTOUT,'Useful life is ',USEFULLIFE:2:0,' years');
WRITELN(LISTOUT,'Scrap value at end of ',USEFULLIFE:2:0,' years: $',
SCRAPVALUE:6:2);
WRITELN(LISTOUT);
TEXTBACKGROUND(1);
GRAPHBACKGROUND(1);
CLRSCR;
GOTOXY(1,5);
TEXTCOLOR(0);
MAKEaLINE;
GOTOXY(1,6);
TEXTCOLOR(15);
MAKEaLINE;
GOTOXY(1,7);
TEXTCOLOR(4);
MAKEaLINE;
GOTOXY(1,9);
TEXTCOLOR(0);
WRITELN(CON,'Name of the item to be depreciated: ',ITEMNAME);
WRITELN(CON,ITEMNAME,' described as: ',ITEMDESCR);
WRITELN(CON,'Aquisition cost: $',AQUISCOST:6:2);
WRITELN(CON,'Useful life is ',USEFULLIFE:2:0,' years.');
WRITELN(CON,'Scrap value at end of ',USEFULLIFE:2:0,' years: $',
SCRAPVALUE:6:2);
WRITELN(CON);
END;
PROCEDURE WRITEVALUE (VAR LISTOUT:TEXT; YEARNUM,CURYR,CUMUL,BOOK:REAL);
{ claculates and adds data to printout }
BEGIN
WRITELN(LISTOUT,YEARNUM:2:0,' ',CURYR:10:2,' ',CUMUL:10:2,
' ',BOOK:10:2)
END;
{ ############### END OF INTERNAL PROCEDURES FOR DEPREC ############## }
BEGIN { Main Procedure DEPREC Code }
ASSIGN(LISTOUT,'LST:');
REWRITE(LISTOUT);
CLRSCR;
SIGNON;
GETDATA;
PRINTmainHEADINGS;
TEXTCOLOR(4);
METHODHEADERS(CON,SL);
TEXTCOLOR(0);
METHODHEADERS(LISTOUT,SL);
CUMDEPREC := 0;
WRITEVALUE(CON,0,0,0,AQUISCOST);
WRITEVALUE(LISTOUT,0,0,0,AQUISCOST);
FOR I := 1 TO TRUNC(USEFULLIFE) DO
BEGIN
CURRENTYR := (AQUISCOST - SCRAPVALUE)/USEFULLIFE;
CUMDEPREC := CUMDEPREC + CURRENTYR;
BOOKVALUE := AQUISCOST - CUMDEPREC;
STRAIGHTLINE := (USEFULLIFE * USEFULLIFE + USEFULLIFE)/2.0;
WRITEVALUE(CON,I,CURRENTYR,CUMDEPREC,BOOKVALUE);
WRITEVALUE(LISTOUT,I,CURRENTYR,CUMDEPREC,BOOKVALUE)
END;
TEXTCOLOR(4);
METHODHEADERS(CON,SOYD);
TEXTCOLOR(0);
METHODHEADERS(LISTOUT,SOYD);
CUMDEPREC := 0;
WRITEVALUE(CON,0,0,0,AQUISCOST);
WRITEVALUE(LISTOUT,0,0,0,AQUISCOST);
FOR I := 1 TO TRUNC(USEFULLIFE) DO
BEGIN
YRSLEFT := USEFULLIFE - I + 1;
CURRENTYR := YRSLEFT / STRAIGHTLINE * (AQUISCOST - SCRAPVALUE);
CUMDEPREC := CUMDEPREC + CURRENTYR;
BOOKVALUE := AQUISCOST - CUMDEPREC;
WRITEVALUE(CON,I,CURRENTYR,CUMDEPREC,BOOKVALUE);
WRITEVALUE(LISTOUT,I,CURRENTYR,CUMDEPREC,BOOKVALUE);
END;
TEXTCOLOR(4);
METHODHEADERS(CON,DB);
TEXTCOLOR(0);
METHODHEADERS(LISTOUT,DB);
CUMDEPREC := 0;
WRITEVALUE(CON,0,0,0,AQUISCOST);
WRITEVALUE(LISTOUT,0,0,0,AQUISCOST);
DBFACTOR := (DBFACTOR / 100.0) / USEFULLIFE;
CURRENTYR := AQUISCOST * DBFACTOR;
I := 1;
ALLDONE := FALSE;
REPEAT
YRSLEFT := USEFULLIFE - I +1;
CUMDEPREC := CUMDEPREC + CURRENTYR;
BOOKVALUE := AQUISCOST - CUMDEPREC;
WRITEVALUE(CON,I,CURRENTYR,CUMDEPREC,BOOKVALUE);
WRITEVALUE(LISTOUT,I,CURRENTYR,CUMDEPREC,BOOKVALUE);
CURRENTYR := BOOKVALUE * DBFACTOR;
I := I +1;
IF (BOOKVALUE < SCRAPVALUE) THEN
BEGIN
ALLDONE := TRUE;
WRITELN;
WRITELN(LISTOUT);
WRITELN('Cannot take depreciation below book value of $',
SCRAPVALUE:6:2);
WRITELN(LISTOUT,'Cannot take depreciation below book value of $',
SCRAPVALUE:6:2);
END;
IF (I > TRUNC(USEFULLIFE)) THEN
ALLDONE := TRUE;
UNTIL (ALLDONE);
WRITELN(LISTOUT);
WRITELN(LISTOUT);
WRITELN(LISTOUT);
MAKEaBORDER(LST);
WRITELN(LISTOUT);
WRITELN(LISTOUT);
MAKEaBORDER(LST);
WRITELN(LISTOUT,CHR(12));
WRITELN(CON);
WRITELN(CON);
TEXTCOLOR(4);
WRITELN(CON,' *** ALL DONE ***',CHR(7));
END;
{************* Prints Out the Variables list for Cost/Test routine **********}
PROCEDURE PRINTVAR;
BEGIN
GRAPHBACKGROUND(3);
TEXTBACKGROUND(3);
CLRSCR;
GOTOXY(1,5);
TEXTCOLOR(0);
MAKEaLINE;
GOTOXY(1,6);
TEXTCOLOR(4);
MAKEaLINE;
GOTOXY(1,7);
TEXTCOLOR(15);
MAKEaLINE;
GOTOXY(10,10);
TEXTCOLOR(14);
WRITE(' PLEASE TURN ON YOUR PRINTER - AUTOMATIC PRINTOUT');
GOTOXY(10,15);
TEXTCOLOR(4);
WRITE(' Peck the `P'' key to begin printout or `N'' to QUIT: ');
READ(KBD,CH);
IF (CH = 'P') OR (CH = 'p') THEN
BEGIN
WRITE(LST,(CHR(27)),(CHR(69)));
WRITELN(LST);
WRITELN(LST);
MAKEaBORDER(LST);
WRITELN(LST);
WRITELN(LST,' **** TEST COST VARIABLES LIST **** ');
WRITELN(LST);
MAKEaBORDER(LST);
WRITELN(LST);
WRITELN(LST);
WRITELN
(LST,' You will need to have the following information available');
WRITELN(LST,' for entry into the test cost analysis:');
WRITELN(LST);
WRITELN(LST,' 1. The name of your facility or lab.');
WRITELN(LST,' 2. Today''s date.');
WRITELN(LST,' 3. The test name.');
WRITELN(LST,' 4. The kit or system manufacturer''s name.');
WRITELN(LST,' 5. The price / kit. ');
WRITELN(LST,' 6. The number of tests / kit.');
WRITELN
(LST,' 7. The averaged claimed shelf life (months) of the kit.');
WRITELN
(LST,' 8. Reconstitued stability of reagents (hours or days).');
WRITELN
(LST,' 9. The number of est. tests / month (incl blank,stds,ctrls).');
WRITELN(LST,' 10. Any new yearly cost for QC survey specimens.');
WRITELN(LST,' 11. The number of control levels used /run.');
WRITELN(LST,' 12. Cost for calibrators if they''re used.');
WRITELN
(LST,' 13. Some quest. about calibration frequency and numbers.');
WRITELN(LST,' 14. The number of standards / run.');
WRITELN
(LST,' 15. If not part of the kit, the cost of the Standards.');
WRITELN
(LST,' 16. The expected number of runs to use up the standards.');
WRITELN(LST,' 17. The number of blanks / run.');
WRITELN(LST,' 18. Whether you''re running singly or in duplicate.');
WRITELN(LST,' 19. Price / known quantity package of consumables.');
WRITELN
(LST,' 20. The number of tests / package of those consumables.');
WRITELN
(LST,' 21. Estimated or known blood drawing/preparation costs.');
WRITELN
(LST,' 22. Maximum batch size / run (incl blanks, stds, ctrls).');
WRITELN(LST,' 23. Price for similar test at your reference lab.');
WRITELN
(LST,' 24. Whether the test uses an automated or semi-auto analyser.');
WRITELN
(LST,' 25. If so, how many different tests the analyser is doing.');
WRITELN
(LST,' 26. If you''re using depreciation allowance, this yrs amount.');
WRITELN(LST,' 27. A tentative price you''ll charge for the test.');
WRITELN
(LST,' 28. An estimate of the average number of patient spec / batch.');
WRITELN(LST,' 29. Estimated Tech time in minutes to run a batch.');
WRITELN(LST,' 30. Tech salary in $ / Hr.');
WRITELN
(LST,' 31. Yearly maintenence/service charges for instrument.');
WRITELN
(LST,' 32. The # of tests of reagent your analyser uses to prime itself ');
WRITELN(LST,' before running a batch.');
WRITELN(LST);
WRITELN(LST);
WRITELN(LST);
MAKEaBORDER(LST);
WRITELN(LST);
WRITELN
(LST,' As you can see, I''m not going to supply you with CAP Workload');
WRITELN
(LST,'units, just simple labor estimates. Labor is a very large and');
WRITELN
(LST,'important part of test costing. However my feeling is that no one ');
WRITELN
(LST,'way of workload accounting is best for all situations - So just');
WRITELN
(LST,'pick a method you like, or use my simple batch labor as the add on to');
WRITELN
(LST,'the cost / test data from this program. Also, because most full, ');
WRITELN
(LST,'instrument calibrations are infrequent, calibrator use of reagent ');
WRITELN(LST,'and consumables is NOT figured into test cost directly.');
WRITELN(LST);
MAKEaBORDER(LST);
WRITELN(LST);
WRITELN(LST);
MAKEaBORDER(LST);
WRITE(LST,CHR(12));
END
END;
{******************************* Escape from DEPREC **************************}
PROCEDURE GETOUT;
BEGIN
TEXTBACKGROUND(1);
CLRSCR;
GOTOXY(15,10);
TEXTCOLOR(15);
WRITELN(' DEPRECIATION PROGRAM - PRINTER MUST BE READY');
GOTOXY(15,13);
TEXTCOLOR(4);
WRITE('Peck `Y'' to continue or `N'' to return to menu: ');
READ(KBD,CH);
IF CH = 'Y' THEN DEPREC;
IF CH = 'y' THEN DEPREC;
END;
{********************************** Statisitics Procedure ******************}
PROCEDURE STATS;
CONST
MAX = 81;
TYPE
STR80 = STRING[80];
DATAITEM = REAL;
DATAARRAY = ARRAY[1..MAX] OF DATAITEM;
VAR
CH:CHAR;
DATA:DATAARRAY;
NUM,T:INTEGER;
A,M,MD,STD,AVG:REAL;
ENTERED,QUIT:BOOLEAN;
DATANAME:STRING[40];
PROCEDURE SIGNON; { initial screen }
BEGIN
GRAPHBACKGROUND(1);
TEXTBACKGROUND(1);
CLRSCR;
GOTOXY(15,8);
LOWVIDEO;
FOR I:=1 TO 50 DO
BEGIN
WRITE(CHR(205))
END;
GOTOXY(14,10);
HIGHVIDEO;
TEXTBACKGROUND(1);
TEXTCOLOR(4);
WRITE('STATISTICS: SD - MEAN - MEDIAN - MIN/MAX - 2SD RANGE');
GOTOXY(15,12);
LOWVIDEO;
FOR J:=1 TO 50 DO
BEGIN
WRITE(CHR(205))
END;
DELAY(3000);
CLRSCR;
END;
PROCEDURE QUICKSORT (VAR ITEM:DATAARRAY;COUNT:INTEGER);
PROCEDURE QS (L,R:INTEGER; VAR IT:DATAARRAY);
VAR
I,J:INTEGER;
X,Y:DATAITEM; { quicksort used to help median calc }
BEGIN
I:=L; J:=R;
X:=IT[(L+R) DIV 2];
REPEAT
WHILE IT[I] < X DO I:= I+1;
WHILE X < IT[J] DO J:= J-1;
IF I <= J THEN
BEGIN
Y:= IT[I];
IT[I]:= IT[J];
IT[J]:= Y;
I:= I+1; J:= J-1;
END;
UNTIL I > J;
IF L < J THEN QS(L,J,IT);
IF L < R THEN QS(I,R,IT)
END;
BEGIN
QS(1,COUNT,ITEM);
END;
FUNCTION ISIN(CH:CHAR;S:STR80):BOOLEAN;
VAR
T:INTEGER;
BEGIN
ISIN:=FALSE;
FOR T:=1 TO LENGTH(S) DO
IF S[T]=CH THEN ISIN:= TRUE;
END; { maybe }
FUNCTION MENU:CHAR;
VAR
CH:CHAR;
BEGIN
GRAPHBACKGROUND(1);
TEXTBACKGROUND(1);
CLRSCR;
WRITELN;
TEXTCOLOR(0);
REPEAT
WRITELN('[D] = Run Q-Chart QC Graph & Statistics Routine - PRINTER REQD.');
WRITELN('[E] = Enter Data');
WRITELN('[B] = Display & Perform Statistics on Entered Data');
WRITELN('[Q] = Quit');
WRITELN;
TEXTCOLOR(4);
WRITE('Please Peck A Letter: ');
TEXTCOLOR(0);
READ(KBD,CH); WRITELN;
CH:=UPCASE(CH);
UNTIL ISIN(CH,'EDBQ');
MENU := CH;
GOTOXY(1,7);
CLREOL;
END;
PROCEDURE DISPLAY (DATA:DATAARRAY;NUM:INTEGER);
VAR
T:INTEGER;
Y:INTEGER;
BEGIN
TEXTBACKGROUND(1);
GOTOXY(1,1);
TEXTCOLOR(14);
CLRSCR;
WRITELN(' DATA FOR: ',DATANAME);
BEGIN
IF (NUM <= 20) THEN
BEGIN
GOTOXY(1,3);
FOR T:=1 TO NUM DO WRITELN(' ',T:2,': ',DATA[T]:5:2);
WRITELN;
END
ELSE
IF (NUM > 20) AND (NUM <= 40) THEN
BEGIN
GOTOXY(1,3);
FOR T:= 21 TO NUM DO WRITELN
(' ',T,': ',DATA[T]:5:2);
GOTOXY(1,3);
FOR T:= 1 TO 20 DO WRITELN(' ',T:2,': ',DATA[T]:5:2);
END
ELSE
IF (NUM > 40) AND (NUM <=60) THEN
BEGIN
GOTOXY(1,3);
FOR T:=41 TO NUM DO WRITELN
(' ',T,': ',DATA[T]:5:2);
GOTOXY(1,3);
FOR T:= 21 TO 40 DO WRITELN
(' ',T,': ',DATA[T]:5:2);
GOTOXY(1,3);
FOR T:=1 TO 20 DO WRITELN(' ',T:2,': ',DATA[T]:5:2);
END
ELSE
IF (NUM > 60) AND (NUM <= 80) THEN
BEGIN
GOTOXY(1,3);
FOR T:=61 TO NUM DO WRITELN
(' ',T,': ',DATA[T]:5:2);
GOTOXY(1,3);
FOR T:= 41 TO 60 DO WRITELN
(' ',T,': ',DATA[T]:5:2);
GOTOXY(1,3);
FOR T:=21 TO 40 DO WRITELN
(' ',T,': ',DATA[T]:5:2);
GOTOXY(1,3);
FOR T:=1 TO 20 DO WRITELN(' ',T:2,': ',DATA[T]:5:2);
END;
END;
GOTOXY(20,24);
TEXTCOLOR(4);
WRITE('Peck Any Key To Continue (or Shft-PrtSc to print): ');
READ(KBD,CH);
END;
PROCEDURE ENTER (VAR DATA:DATAARRAY);
VAR
T:INTEGER;
BEGIN
TEXTBACKGROUND(1);
TEXTCOLOR(0);
REPEAT
ENTERED := FALSE;
GOTOXY(5,10);
WRITE('How Many Data Items (1 to 80) ? : ');
TEXTCOLOR(15);
READ(NUM);
IF (NUM > 80) THEN
BEGIN
SOUND(500);
DELAY(700);
NOSOUND;
GOTOXY(15,23);
TEXTCOLOR(14);
WRITE('HEY!!!! FOLLOW DIRECTIONS FOR ARRAY SIZE!!!');
DELAY(2000);
CLEARLINES;
GOTOXY(5,10);
CLREOL;
END;
UNTIL (NUM <= 80);
WRITELN;
GOTOXY(5,12);
WRITE('Enter Heading for Data (1-40 char): ');
READ(DATANAME);
WRITELN;
FOR T:=1 TO NUM DO
BEGIN
TEXTCOLOR(0);
GOTOXY(5,23);
WRITE('Enter Item ',t,' : ');
TEXTCOLOR(15);
READ(DATA[T]);
CLEARLINES;
END;
GOTOXY(1,24);
TEXTCOLOR(4);
SOUND(300);
DELAY(600);
NOSOUND;
WRITE
('OK, That''s It - Peck Any Key to Continue: ');
READ(KBD,CH);
ENTERED := TRUE;
END;
FUNCTION MEAN(DATA:DATAARRAY;NUM:INTEGER):REAL;
VAR
T:INTEGER;
AVG:REAL;
BEGIN
AVG:=0;
FOR T:=1 TO NUM DO AVG:=AVG+DATA[T];
MEAN:=AVG/NUM;
END;
FUNCTION STDDEV (DATA:DATAARRAY;NUM:INTEGER):REAL;
VAR
T:INTEGER;
STD,AVG:REAL;
BEGIN
AVG:=MEAN(DATA,NUM);
STD:=0;
FOR T:= 1 TO NUM DO
STD:=STD+((DATA[T]-AVG)*(DATA[T]-AVG));
STD:=STD/NUM;
STDDEV:=SQRT(STD);
END;
FUNCTION MEDIAN (DATA:DATAARRAY;NUM:INTEGER):REAL;
VAR
DTEMP:DATAARRAY;
T:INTEGER;
BEGIN
MEDIAN:=1;
FOR T:=1 TO NUM DO DTEMP[T]:=DATA[T];
QUICKSORT(DTEMP,NUM);
MEDIAN:= DTEMP[NUM DIV 2];
END;
FUNCTION GETMAX(DATA:DATAARRAY;NUM:INTEGER):INTEGER;
VAR
T:INTEGER;
MAX:REAL;
BEGIN
MAX:=DATA[1];
FOR T:=2 TO NUM DO
IF DATA[T] > MAX THEN MAX:= DATA[T];
GETMAX := ROUND(MAX);
END;
FUNCTION GETMIN(DATA:DATAARRAY;NUM:INTEGER):INTEGER;
VAR
T:INTEGER;
MIN:REAL;
BEGIN
MIN:= DATA[1];
FOR T:=2 TO NUM DO
IF DATA[T] < MIN THEN MIN:= DATA[T];
GETMIN:= TRUNC(MIN);
END;
PROCEDURE TRANSFER; {*** FOR GOING TO Q-CHART.EXE ***}
VAR
TRANSFER:FILE;
BEGIN
ASSIGN(TRANSFER,'EXEC.COM');
EXECUTE(TRANSFER);
END;
BEGIN { Main Code for Stats }
SIGNON;
FOR NUM:=1 TO 80 DO
DATA[NUM]:=0; { Zero the array space }
ENTERED := FALSE;
DATANAME := ' ';
REPEAT
CH:=UPCASE(MENU);
CASE CH OF
'E':ENTER(DATA);
'D':TRANSFER;
'B': BEGIN
IF ENTERED THEN
BEGIN
CLRSCR;
DISPLAY(DATA,NUM);CLRSCR;
GOTOXY(10,2);
WRITELN('STATISTICS FOR: ',DATANAME);
GOTOXY(1,5);
TEXTCOLOR(7);
A:=MEAN(DATA,NUM);
M:=MEDIAN(DATA,NUM);
STD:=STDDEV(DATA,NUM);
WRITELN;
WRITELN('MEDIAN : ',M:10:2);
WRITELN;
WRITELN('MEAN : ',A:10:2);
WRITELN;
WRITELN('STANDARD DEVIATION: ',STD:10:2);
WRITELN;
WRITELN('CV in % : ',((STD/A)*100):10:2);
WRITELN;
WRITELN
('MAXIMUM VALUE : ',GETMAX(DATA,NUM):10,' Rounded (up)');
WRITELN;
WRITELN
('MINIMUM VALUE : ',GETMIN(DATA,NUM):10,' Truncated (down)');
WRITELN;
WRITELN
('2 SD RANGE : ',(A-(2*STD)):10:2,' TO ',(A+(2*STD)):10:2);
GOTOXY(1,23);
TEXTCOLOR(4);
WRITE('Peck any Key when done (or Shft-PrtSc to Print): ');
READ(KBD,CH);
CH := 'Q';
END
ELSE
IF NOT ENTERED THEN
BEGIN
GOTOXY(5,20);
TEXTCOLOR(15);
WRITE('SORRY - NO VALUES, NO STATISTICS');
GOTOXY(1,23);
TEXTCOLOR(4);
WRITE('Peck any Key to continue: ');
READ(KBD,CH);
ENTERED :=FALSE;
END;
END;
END;
UNTIL CH = 'Q';
END;
{***************************** Moving Average Procedure ********************}
PROCEDURE MOVINGAV;
CONST
MAXNUMPERIOD=50;
TYPE
PERNUMTYPE=1..MAXNUMPERIOD;
STRINGTYPE=STRING[80];
VAR
CH:CHAR;
I,J,K,L:INTEGER;
NUMAVERAGED,NUMPERIODS:INTEGER;
PERIODVALUE:ARRAY [PERNUMTYPE] OF REAL;
TRENDVALUE:REAL;
PROCEDURE SIGNON; { FIRST SCREEN }
BEGIN
GRAPHBACKGROUND(1);
TEXTBACKGROUND(1);
CLRSCR;
GOTOXY(15,8);
LOWVIDEO;
FOR I:=1 TO 50 DO
BEGIN
WRITE(CHR(205))
END;
GOTOXY(20,10);
HIGHVIDEO;
TEXTBACKGROUND(1);
TEXTCOLOR(4);
WRITE('TREND ANALYSIS with MOVING AVERAGES');
GOTOXY(15,12);
LOWVIDEO;
FOR J:= 1 TO 50 DO
BEGIN
WRITE(CHR(205))
END;
DELAY(3000);
CLRSCR;
END;
PROCEDURE AVERAGINGPERIOD; { GETS DATA }
BEGIN
REPEAT
WRITELN;
LOWVIDEO;
TEXTBACKGROUND(1);
WRITE(' Enter the number of periods to be averaged: ');
HIGHVIDEO;
TEXTBACKGROUND(1);
READLN(NUMAVERAGED);
IF (NUMAVERAGED < 1) THEN
BEGIN
WRITELN;
WRITE('HEY!!!! Are You TRYING To Make Me CRASH? ');
END;
WRITELN;
UNTIL (NUMAVERAGED >= 1);
END;
PROCEDURE FACTSONLY; { GETS MORE BIRDFOOD }
VAR
PERIODCOUNTER:PERNUMTYPE;
BEGIN
GRAPHBACKGROUND(1);
TEXTBACKGROUND(1);
CLRSCR;
LOWVIDEO;
TEXTBACKGROUND(1);
TEXTCOLOR(0);
WRITE('How many TIME PERIODS are to be pecked in? (50 Maximum): ');
HIGHVIDEO;
TEXTBACKGROUND(1);
READLN(NUMPERIODS);
IF (NUMPERIODS > 50) THEN
BEGIN
WRITELN;
TEXTCOLOR(4);
WRITE('Hey! That''s more than 50. Try again: ');
TEXTCOLOR(0);
READLN(NUMPERIODS);
END;
WRITELN;
LOWVIDEO;
TEXTBACKGROUND(1);
TEXTCOLOR(0);
WRITELN('OK, enter a value for each of the ',NUMPERIODS,' periods: ');
WRITELN;
FOR PERIODCOUNTER:=1 TO NUMPERIODS DO
BEGIN
LOWVIDEO;
TEXTBACKGROUND(1);
WRITE(' ',PERIODCOUNTER:3,': ');
HIGHVIDEO;
TEXTBACKGROUND(1);
READLN(PERIODVALUE[PERIODCOUNTER])
END;
SOUND(400);
DELAY(400);
NOSOUND;
AVERAGINGPERIOD; { RUN PROCEDURE AVERAGINGPERIOD }
WRITELN;
WRITELN;
WRITELN;
END;
PROCEDURE PATTERN1 (VAR F:TEXT);
BEGIN
TEXTBACKGROUND(1);
LOWVIDEO;
TEXTBACKGROUND(1);
WRITE(F,' ');
FOR L:=1 TO 70 DO
BEGIN
WRITE(F,CHR(205))
END;
HIGHVIDEO;
TEXTBACKGROUND(1);
WRITELN(F)
END;
PROCEDURE PATTERN2 (VAR F:TEXT);
BEGIN
TEXTBACKGROUND(1);
LOWVIDEO;
TEXTBACKGROUND(1);
WRITE(F,' ');
FOR K:=1 TO 50 DO
BEGIN
WRITE(F,'-');
END;
HIGHVIDEO;
TEXTBACKGROUND(1);
WRITELN(F);
END;
PROCEDURE MAKETHETABLE (VAR F:TEXT); { PRODUCE TIME TREND TABLE }
VAR
COUNTER:PERNUMTYPE;
NUMSEQUENCE:INTEGER;
BEGIN
TEXTBACKGROUND(1);
CLRSCR;
LOWVIDEO;
TEXTBACKGROUND(1);
PATTERN1(F);
WRITELN(F);
HIGHVIDEO;
TEXTBACKGROUND(1);
WRITELN(F,' MOVING AVERAGES - TIME TREND ANALYSIS');
WRITELN(F);
LOWVIDEO;
TEXTBACKGROUND(1);
PATTERN1(F);
WRITELN(F);
HIGHVIDEO;
TEXTBACKGROUND(1);
WRITE(F,' ');
WRITELN(F,'PERIOD RAW DATA SMOOTHED DATA');
PATTERN2(F);
WRITELN(F);
FOR NUMSEQUENCE:=1 TO NUMPERIODS + 1 DO
BEGIN
TRENDVALUE:=0;
IF (NUMSEQUENCE > NUMAVERAGED) THEN
BEGIN
FOR COUNTER:=1 TO NUMAVERAGED DO
TRENDVALUE:=TRENDVALUE + PERIODVALUE[NUMSEQUENCE-COUNTER];
TRENDVALUE:=TRENDVALUE/NUMAVERAGED;
END;
IF (NUMSEQUENCE <= NUMPERIODS) THEN
BEGIN
WRITE(F,' ',NUMSEQUENCE:7);
WRITE(F,' ',PERIODVALUE[NUMSEQUENCE]:7:1);
WRITELN(F,' ',TRENDVALUE:7:1)
END
ELSE
BEGIN
WRITELN(F);
LOWVIDEO;
TEXTBACKGROUND(1);
PATTERN2(F);
HIGHVIDEO;
TEXTBACKGROUND(1);
WRITE(F,' ','THE TREND FORCASTS PERIOD ');
WRITELN(F,NUMSEQUENCE,' AS: ',TRENDVALUE:7:1);
PATTERN2(F);
WRITE(F,' ');
WRITELN(F,'NUMBER OF PERIODS AVERAGED: ',NUMAVERAGED)
END
END;
WRITELN(F);
PATTERN1(F);
END;
BEGIN { MAIN CODE }
SIGNON;
FACTSONLY;
CLRSCR;
REPEAT
MAKETHETABLE(CON);
WRITELN;
LOWVIDEO;
TEXTBACKGROUND(1);
TEXTCOLOR(4);
WRITE(' Repeat the Display? (Y/N): ');
HIGHVIDEO;
TEXTBACKGROUND(1);
READ(KBD,CH);
IF (CH='Y') OR (CH='y') THEN
BEGIN
WRITELN;
LOWVIDEO;
TEXTBACKGROUND(1);
TEXTCOLOR(0);
WRITE
(' Change the number of periods to be averaged? (Y/N): ');
HIGHVIDEO;
TEXTBACKGROUND(1);
READ(KBD,CH);
IF (CH='Y') OR (CH='y') THEN
AVERAGINGPERIOD { GENERATE REVISED TABLE }
ELSE
MAKETHETABLE(CON)
END
UNTIL (CH='N') OR (CH='n');
WRITELN;
LOWVIDEO;
TEXTBACKGROUND(1);
TEXTCOLOR(16);
WRITELN(' For a printout, turn on the printer.');
TEXTCOLOR(0);
WRITE(' When ready, peck the letter `Y'', or `N'' to QUIT: ');
HIGHVIDEO;
TEXTBACKGROUND(1);
READ(KBD,CH);
WHILE (CH='Y') OR (CH='y') DO
BEGIN
WRITE(LST,(CHR(27)),(CHR(69)));
MAKETHETABLE(LST);
WRITE(LST,CHR(12));
WRITELN;
LOWVIDEO;
TEXTBACKGROUND(1);
WRITE(' Do another printout? (Y/N): ');
READ(KBD,CH)
END
END;
{*************************** Employee Evaluation Procedure ******************}
PROCEDURE eval; { This is an Assignment/Execute Procedure }
VAR EVALUATE:FILE; { To work, you must have compiled .COM }
{ versions of LABCOAT.PAS and EVALUATE.PAS }
{ together on the same disk. }
BEGIN
ASSIGN(EVALUATE,'EVALUATE.COM');
EXECUTE (evaluate);
END;
{******************************** Escape from EVALUATE *********************}
PROCEDURE EVALESCAPE;
BEGIN
TEXTBACKGROUND(1);
CLRSCR;
GOTOXY(20,10);
TEXTCOLOR(15);
WRITELN('EMPLOYEE EVALUATION PROGRAM');
GOTOXY(15,13);
TEXTCOLOR(4);
WRITE('Peck `Y'' to continue or `N'' to return to Main Menu: ');
READ(KBD,CH);
IF CH = 'Y' THEN EVAL;
IF CH = 'y' THEN EVAL;
END;
PROCEDURE LIPO; { Calls Program LIPID via Execute }
VAR
LIPID:FILE;
BEGIN
ASSIGN(LIPID,'LIPID.COM');
EXECUTE(LIPID);
END;
procedure birdstuff;
var birdface:file;
begin
assign (birdface,'birdface.com');
execute(birdface); end;
{############################# MAIN PROGRAM BODY ############################}
BEGIN
SIGNON;
EXPLAIN;
MEM[$40:$17] := MEM[$40:$17] OR $40; { toggles caps lock on }
QUIT := FALSE;
REPEAT
TEXTBACKGROUND(2);
GRAPHBACKGROUND(2);
TEXTCOLOR(1);
CLRSCR;
GOTOXY(1,3);
MAKEaLINE;
GOTOXY(27,5);
TEXTCOLOR(4);
WRITE('**** MAIN USER MENU ****');
GOTOXY(1,7);
TEXTCOLOR(1);
MAKEaLINE;
GOTOXY(1,16);
TEXTCOLOR(1);
MAKEaLINE;
GOTOXY(1,17);
TEXTCOLOR(15);
MAKEaLINE;
GOTOXY(1,18);
TEXTCOLOR(4);
MAKEaLINE;
GOTOXY(1,19);
TEXTCOLOR(15);
MAKEaLINE;
GOTOXY(1,20);
TEXTCOLOR(1);
MAKEaLINE;
GOTOXY(1,21);
TEXTCOLOR(4);
MAKEaLINE;
GOTOXY(1,22);
TEXTCOLOR(15);
MAKEaLINE;
GOTOXY(1,23);
TEXTCOLOR(1);
MAKEaLINE;
GOTOXY(5,9);
TEXTCOLOR(0);
WRITE
(' [V] = Print Variables List [T] = Enter Test Cost Data ');
WRITELN;
GOTOXY(5,11);
WRITE
(' [D] = Figure Depreciation [S] = Mean , StanDev, Range');
GOTOXY(5,13);
WRITE
(' [M] = Moving Average Calculation [E] = Employee evaluation ');
GOTOXY(5,15);
WRITE
(' [L] = Lipid Profile [A] = Art [Q] = QUIT Peck Your Choice: ');
READ(KBD,CH);
CASE CH OF
'V','v' : PRINTVAR;
'T','t' : CHOOSE;
'Q','q' : QUIT := TRUE;
'D','d' : GETOUT;
'S','s' : STATS;
'L','l' : LIPO; {!!!! Execute Procedure - See note Below!!!}
'M','m' : MOVINGAV;
'A','a' : BIRDSTUFF; {!!! Go to Birdface Execute !!!}
'E','e' : evalescape; {!!!!!!! Don't Use this Execute Procedure}
END; {Unless compiling to a COM file!!!!!!!!!!}
UNTIL QUIT;
GRAPHBACKGROUND(0);TEXTBACKGROUND(0);TEXTCOLOR(7); { Reset Video to Exit }
MEM[$40:$17] := MEM[$40:$17] AND $40; { Reset Keyboard to Caps Lock Off }
MEM[$40:$17] := MEM[$40:$17] AND $20; { Reset Keyboard to Num Lock Off }
CLRSCR
END.
{ }